<?php
/**
 * 商汇网 文章发布系统
 */

//**** 初始化一些目录信息 ****//

define('ROOT_PATH', dirname(__FILE__) . '/'); //文件根目录
define('LIB_PATH', ROOT_PATH . 'lib/'); //执行的主要目录
define('POST_URL_KEY_LIST', ROOT_PATH . 'postUrlKeyList/');//保存已发布的文章的链接和关键词的目录（标题）
define('POST_KEY_LOG', ROOT_PATH . 'keyLog/');//保存已发布过的关键词的目录
define('IMAGE_LIST_PATH', ROOT_PATH . 'imglist/');//已保存的图片目录
define('KEY_LIST_PATH', ROOT_PATH . 'keylist/');//已保存的关键字
define('POST_LOG_PATH', POST_URL_KEY_LIST . 'log/');//已保存的关键字


//**** 引用类库信息 ****//
require LIB_PATH . 'lib.functions.php';  // 导入类库方法(公共)
require LIB_PATH . 'Shanghui5.Class.php';   // 导入功能方法(自用)
require ROOT_PATH . 'config.php';         // 引入配置信息


//保存昨天日志
//copy(ROOT_PATH . 'corn.log',ROOT_PATH . '/log/'.date("Y-m-d",strtotime("-1 day")).'.corn.log');
// 初始化发布列队
$processList = array();
date_default_timezone_set('PRC');


//**** 执行流程 ****//
$printStr = sprintf("==商会网发文章系统==\n启动时间: %s\n进程ID:%s\n\n", date('Y-m-d H:i:s'), posix_getpid());
print_f($printStr);

// 初始化登录每个账号
print_f("共导入账号 " . count($userList) . " 个，登录中...\n");
foreach ($userList as $userName => $userInfo) {
    print_f("登录账号 {$userName} ...");

    // 初始化创建对象
    $userList[$userName]['sh5Obj'] = new Shanghui5($userInfo['userName'], $userInfo['userPass']);

    // 检查初始是否成功
    if ($userList[$userName]['sh5Obj']->getErrorMsg() == 'NotLogin') {
        if (!$userList[$userName]['sh5Obj']->userLogin()) {
            // 登录失败
            print_f("登录失败: " . $userList[$userName]['sh5Obj']->getErrorMsg() . "\n");
            // 删除本对象
            unset($userList[$userName]);
        } else {
            $userList[$userName]['sh5Obj']->saveCookie();
            print_f("登录成功\n");
        }
    } else {
        print_f("登录成功(缓存)\n");
    }
}


print_f("共登录成功 " . count($userList) . " 个账号.\n\n");

// 创建每个账号的文章发布列队
print_f("生成发布文章列队...\n");
foreach ($userList as $userName => $userInfo) {
    $time = rand($interTimeMin, $interTimeMax); #6-12之间随机一个值
    $data = strtotime("+{$time} seconds");#随机延长的时间

    $processList[] = array('time' => $data, 'userName' => $userName);
    print_f("[加入列队] 发布时间: " . date('Y-m-d H:i:s', $data) . " 账号: {$userName}\n");

    // 初始化一些其他数据
    $userList[$userName]['addPostNum'] = 1;
}


// 处理列队里面的数据
print_f("\n开始处理列队...\n");

while (count($processList) > 0) {
    print_f("[列队数量] " . count($processList) . "\n");

    // 对列队时间排序
    uasort($processList, function ($a, $b) {
        return $a['time'] - $b['time'];
    });

    // 取出第一个成员
    $process = array_shift($processList);
    $userName = $process['userName'];

    print_f("[处理列队] 下次任务时间: " . date('Y-m-d H:i:s', $process['time']) . " 当前时间: " . date('Y-m-d H:i:s') . " 执行账号: {$userName}\n");


    // 计算需要延迟多久
    if ($process['time'] > time()) {
        $sleep = $process['time'] - time();
        print_f("[列队等待] 还需等待 {$sleep}s\n");
        sleep($sleep);
    }

    //**** 发布文章流程 ****//
    $columnInfo = $userList[$userName]['columnList'];

    // 获取一个文章库标示
    if (is_string($columnInfo['mark'])) {
        $columnInfo['mark'] = explode(',', $columnInfo['mark']);//假设有多个mark 值的话，弄成数组
        $userList[$userName]['columnList']['mark'] = $columnInfo['mark'];
    }
    $mark_id = array_rand($columnInfo['mark']); //随机取出一个,返回的是键名
    $markName = $columnInfo['mark'][$mark_id]; //取出 mask 的值

    // 获取文章
    print_f("[文章标记] {$markName} , 获取文章...\n");
    $postArr = getDalArticle($markName);

    if (empty($postArr[0]['body'])) {
        print_f("!!错误 获取文章错误,3秒重新获取文章 ... \n");
        sleep(3);
        $postArr = getDalArticle($markName);
    } else {
        $postInfo = $postArr['0'];
    }


    // 获取标题关键词
    $keyListDir = KEY_LIST_PATH . $columnInfo['key']; #关键字文件
    $postKeyword = getFileKeyword($keyListDir);  #获取标题步骤

    //图片所存放的位置
    $imgFile = IMAGE_LIST_PATH . $columnInfo['img'];

    // 字符串替换
    $postInfo['body'] = postBodyReplace($postInfo['body'], $userList[$userName]['hosType'], $postKeyword, $imgFile); #修改内容，替换成与专题相关的内容

    #修改成过个栏目的,100 条分给 新闻的，900 条分给 行情的
    $addPostRet = $userList[$userName]['sh5Obj']->postCondition($postKeyword, $postInfo['body'], $columnList, $userList[$userName]['addPostNum']);

    // 判断是否发布成功
    $isNextAdd = true;
    if ($addPostRet) {
        print_f("[发布成功] 账号: {$userName} 第 {$userList[$userName]['addPostNum']} 篇 <{$postKeyword}>\n");
        $userList[$userName]['addPostNum']++;
        //限定每个账号每天只能发1000篇文章
        if ($userList[$userName]['addPostNum'] > 1000) $isNextAdd = false;
    } else {
        $errorMsg = $userList[$userName]['sh5Obj']->getErrorMsg();
        if ($errorMsg == '操作频繁') $isNextAdd = false;
        print_f("[发布失败] 账号: {$userName} 错误原因: {$errorMsg}\n\n");
        //更新关键词附表的（ID）标识-1
        modityKeyId($keyListDir);
    }

    // 创建下次发布时间
    if ($isNextAdd) {
        $time = rand($interTimeMin, $interTimeMax);
        $data = strtotime("+{$time} seconds");

        $processList[] = array('time' => $data, 'userName' => $userName);
        print_f("[加入列队] 发布时间: " . date('Y-m-d H:i:s', $data) . " 账号: {$userName}\n\n");
    } //停止当前账号的文章发布，并记录当天发布文章的所有链接及标题（关键词）
    else {

        print_f("====导出今天发布的所有文章链接及标题===\n");
        $date = date("Y-m-d H:i:s", time());

        $D_flag1 = file_put_contents(POST_URL_KEY_LIST . $userName . ".csv", $date . "\n", FILE_APPEND);   //将今天的日期写入到里面
        $D_flag2 = file_put_contents(POST_KEY_LOG . $userName . "_key.csv", "\n" . $date . ",", FILE_APPEND); // 日志，填充日期和,
        file_put_contents(POST_LOG_PATH . date('m-d') . ".csv", $userName . "\n", FILE_APPEND); // 只有一个账号，所以只需要输出一次

        #判断是否存在 new 里面要保存的信息
        $newInfo = $userList[$userName]['sh5Obj']->getPostList(1, $columnList['my']['url']);
        if (!empty($newInfo['info'][0])) {
            file_put_contents(POST_LOG_PATH . date('m-d') . ".csv", '公司新闻栏目' . "\n", FILE_APPEND);
            $userList[$userName]['sh5Obj']->writeLog(8, $columnList['new'], $userName);
        }

        #将 my 里面的信息进行保存
        file_put_contents(POST_LOG_PATH . date('m-d') . ".csv", '行情管理栏目' . "\n", FILE_APPEND);
        $userList[$userName]['sh5Obj']->writeLog(60, $columnList['my'], $userName);
    }
}


//==========================================百度推送======================================

// 主动将前一天发布的文章链接推送给百度:昨天
print_f("检查昨天的连接并主动推送到百度...\n");
pushBaidu($userList, $day = "昨天");


// 主动将今天发布的文章链接推送给百度:今天
print_f("检查今天的连接并主动推送到百度...\n");
pushBaidu($userList, $day = "今天");

//==========================================百度推送======================================
print_f("[结束]\n");
